#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

#ifdef CLIENT_MODE
#include <QtWidgets/QApplication>
#include "client.h"
#include "client/client_gui/LoginWindow.h"
#include "client/client_gui/client_wrapper.h"
#endif

#include "server.h"
#include "db.h"
#include "ssl_wrapper.h"
#include "auth/sm3_auth.h"

// 全局变量用于信号处理
volatile int running = 1;

// 信号处理函数
void handle_signal(int sig)
{
    printf("接收到信号 %d，准备退出...\n", sig);
    running = 0;
}

// 服务端主函数
int server_main(int port)
{
    printf("启动服务器，监听端口: %d\n", port);

    // 初始化数据库
    sqlite3 *db = NULL;
    if (init_database(&db) != 0)
    {
        fprintf(stderr, "初始化数据库失败\n");
        return -1;
    }
    printf("数据库初始化成功\n");

    // ---- 添加测试用户 ----
    printf("尝试添加测试用户 'testuser'...\n");
    // 假设 permission_level 0 是一般用户
    // add_user 在 "db.h" 中声明，该头文件已通过 "server.h" 或直接被包含
    int add_ret = add_user(db, "testuser", "password123", 0);
    if (add_ret == 0)
    {
        printf("用户 'testuser' 添加成功。\n");
    }
    else if (add_ret == -1)
    {
        // 根据 user_auth.c 中的 add_user 实现，-1 表示用户已存在或参数/内部错误
        printf("添加用户 'testuser' 失败 (可能已存在或发生错误)。检查数据库日志或 add_user 实现获取更多信息。\n");
    }
    else
    {
        printf("添加用户 'testuser' 失败，未知错误码: %d\n", add_ret);
    }
    // ---- 测试用户添加结束 ----

    // 设置信号处理
    signal(SIGINT, handle_signal);
    signal(SIGTERM, handle_signal);

    // 初始化服务端
    int server_fd = server_init(port);
    if (server_fd < 0)
    {
        fprintf(stderr, "服务器初始化失败\n");
        close_database(db);
        return -1;
    }

    // 初始化OpenSSL和GmSSL
    if (!init_openssl_engine())
    {
        fprintf(stderr, "初始化密码引擎失败\n");
        server_cleanup(server_fd);
        close_database(db);
        return -1;
    }

    printf("服务器初始化完成，等待连接...\n");

    // 主循环
    while (running)
    {
        int client_fd = server_accept(server_fd);
        if (client_fd > 0)
        {
            server_handle_connection(client_fd, db);
        }
    }

    // 清理资源
    printf("服务器关闭中...\n");
    server_cleanup(server_fd);
    cleanup_openssl();
    cleanup_gmssl();
    close_database(db);

    return 0;
}

#ifdef CLIENT_MODE
// 客户端主函数
int client_main(const char *server_ip, int port)
{
    printf("启动客户端，连接服务器: %s:%d\n", server_ip, port);

    // 初始化QT应用程序
    int argc = 0;
    char **argv = NULL;
    QApplication app(argc, argv);

    // 初始化客户端
    client_init();

    // 创建客户端包装器和登录窗口
    ClientWrapper *clientWrapper = new ClientWrapper();
    LoginWindow *loginWindow = new LoginWindow(clientWrapper);

    // 显示登录窗口
    loginWindow->show();

    // 运行QT事件循环
    int ret = app.exec();

    // 清理资源
    delete loginWindow;
    delete clientWrapper;
    client_cleanup();

    return ret;
}
#endif

int main(int argc, char *argv[])
{
    int port = 8888; // 默认端口

    // 解析命令行参数
    if (argc > 1)
    {
        if (strcmp(argv[1], "-s") == 0)
        {
            // 服务端模式
            if (argc > 2)
            {
                port = atoi(argv[2]);
            }
            return server_main(port);
        }
#ifdef CLIENT_MODE
        else if (strcmp(argv[1], "-c") == 0)
        {
            // 客户端模式
            const char *server_ip = "127.0.0.1"; // 默认连接本地服务器
            if (argc > 2)
            {
                server_ip = argv[2];
            }
            if (argc > 3)
            {
                port = atoi(argv[3]);
            }
            return client_main(server_ip, port);
        }
#endif
    }

    // 显示使用帮助
    printf("用法:\n");
    printf("  服务端模式: %s -s [端口]\n", argv[0]);
#ifdef CLIENT_MODE
    printf("  客户端模式: %s -c [服务器IP] [端口]\n", argv[0]);
#endif

    return 1;
}